/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.clinicariobamba.ReglasNegocio.Funciones;

import com.clinicariobamba.ReglasNegocio.Clases.Composicion;
import com.clinicariobamba.ReglasNegocio.Clases.Dependencia;
import com.clinicariobamba.ReglasNegocio.Clases.Elemento;
import com.clinicariobamba.ReglasNegocio.Clases.Entrada;
import com.clinicariobamba.ReglasNegocio.Clases.EstadoCivil;
import com.clinicariobamba.ReglasNegocio.Clases.Etnia;
import com.clinicariobamba.ReglasNegocio.Clases.HistoriaClinica;
import com.clinicariobamba.ReglasNegocio.Clases.Organizacion;
import com.clinicariobamba.ReglasNegocio.Clases.OrganizacionDependencia;
import com.clinicariobamba.ReglasNegocio.Clases.Paciente;
import com.clinicariobamba.ReglasNegocio.Clases.ProfesionalSalud;
import com.clinicariobamba.ReglasNegocio.Clases.TipoEntrada;
import com.clinicariobamba.Util.Util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.TransformerException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 *
 * @author Gis
 */
public class FuncionesXml {

    public static boolean CrearXML(HistoriaClinica hce, Composicion comp, ArrayList<Entrada> lstEntradas, ArrayList<Elemento> lstElementosSV, ArrayList<Elemento> lstMedicamentos, ArrayList<Elemento> lstExamenes) {
        boolean r = false;
        try {
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

            // root elements
            Document doc = docBuilder.newDocument();

            Element rootElement = doc.createElement("historiaclinica");
            doc.appendChild(rootElement);

            Element header = doc.createElement("historia_clinica_header");
            rootElement.appendChild(header);

            Element body = doc.createElement("historia_clinica_body");
            rootElement.appendChild(body);

            Element id_hce = doc.createElement("identificador_hce");
            id_hce.appendChild(doc.createTextNode(hce.getIdHc().toString()));
            header.appendChild(id_hce);

            // paciente elements
            Element paciente = doc.createElement("paciente");
            header.appendChild(paciente);
            paciente.setAttribute("id", hce.getPaciente().getId_p().toString());

            Element ci = doc.createElement("cedula");
            ci.appendChild(doc.createTextNode(hce.getPaciente().getCi()));
            paciente.appendChild(ci);

            Element nombres = doc.createElement("nombres");
            nombres.appendChild(doc.createTextNode(hce.getPaciente().getNombres()));
            paciente.appendChild(nombres);

            Element apellidos = doc.createElement("apellidos");
            apellidos.appendChild(doc.createTextNode(hce.getPaciente().getApellidos()));
            paciente.appendChild(apellidos);

            Element sexo = doc.createElement("sexo");
            sexo.appendChild(doc.createTextNode(hce.getPaciente().getSexo()));
            paciente.appendChild(sexo);

            Element fecNac = doc.createElement("fechaNac");
            fecNac.appendChild(doc.createTextNode(hce.getPaciente().getFechaNac()));
            paciente.appendChild(fecNac);

            Element estadoCivil = doc.createElement("estadoCivil");
            paciente.appendChild(estadoCivil);
            estadoCivil.setAttribute("id", hce.getPaciente().getEstadoCivil().getIdEstC().toString());

            Element descEstadoCivil = doc.createElement("descripcion");
            descEstadoCivil.appendChild(doc.createTextNode(hce.getPaciente().getEstadoCivil().getDescripcion()));
            estadoCivil.appendChild(descEstadoCivil);

            Element etnia = doc.createElement("etnia");
            paciente.appendChild(etnia);
            etnia.setAttribute("id", hce.getPaciente().getEtnia().getIdEtnia().toString());

            Element descEtnia = doc.createElement("descripcion");
            descEtnia.appendChild(doc.createTextNode(hce.getPaciente().getEtnia().getDescripcion()));
            etnia.appendChild(descEtnia);

            Element religion = doc.createElement("religion");
            religion.appendChild(doc.createTextNode(hce.getPaciente().getReligion()));
            paciente.appendChild(religion);

            Element lateralidad = doc.createElement("lateralidad");
            lateralidad.appendChild(doc.createTextNode(hce.getPaciente().getLateralidad()));
            paciente.appendChild(lateralidad);

            Element lugarNac = doc.createElement("lugarNacimiento");
            lugarNac.appendChild(doc.createTextNode(hce.getPaciente().getLugarNacimiento()));
            paciente.appendChild(lugarNac);

            Element lugarRes = doc.createElement("lugarResidencia");
            lugarRes.appendChild(doc.createTextNode(hce.getPaciente().getLugarResidencia()));
            paciente.appendChild(lugarRes);

            Element direccion = doc.createElement("direccion");
            direccion.appendChild(doc.createTextNode(hce.getPaciente().getDireccion()));
            paciente.appendChild(direccion);

            Element telefono = doc.createElement("telefono");
            telefono.appendChild(doc.createTextNode(hce.getPaciente().getTelefono()));
            paciente.appendChild(telefono);

            Element profesion = doc.createElement("profesion");
            profesion.appendChild(doc.createTextNode(hce.getPaciente().getProfesion()));
            paciente.appendChild(profesion);

            Element composicion = doc.createElement("composicion");
            body.appendChild(composicion);
            composicion.setAttribute("id", comp.getIdComposicion().toString());
            composicion.setAttribute("fecha", comp.getFecha().toString());

            Element ps = doc.createElement("profesionalSalud");
            ps.setAttribute("id", comp.getProfesionalSalud().getCi());
            composicion.appendChild(ps);

            Element nombrePs = doc.createElement("nombres");
            nombrePs.appendChild(doc.createTextNode(comp.getProfesionalSalud().getNombres()));
            ps.appendChild(nombrePs);

            Element apellidoPs = doc.createElement("apellidos");
            apellidoPs.appendChild(doc.createTextNode(comp.getProfesionalSalud().getApellidos()));
            ps.appendChild(apellidoPs);

            Element especialidad = doc.createElement("especialidad");
            especialidad.appendChild(doc.createTextNode(comp.getProfesionalSalud().getEspecializacion()));
            ps.appendChild(especialidad);

            Element organizacion = doc.createElement("organizacion");
            //organizacion.setAttribute("idOrg", comp.getOrganizacionDependencia().getOrganizacion().getIdOrganizacion().toString());
            composicion.appendChild(organizacion);

            Element nombreOrg = doc.createElement("nombre");
            nombreOrg.appendChild(doc.createTextNode(comp.getOrganizacionDependencia().getOrganizacion().getNombre()));
            organizacion.appendChild(nombreOrg);

            Element direccionOrg = doc.createElement("direccion");
            direccionOrg.appendChild(doc.createTextNode(comp.getOrganizacionDependencia().getOrganizacion().getDireccion()));
            organizacion.appendChild(direccionOrg);

            Element telfOrg = doc.createElement("telefono");
            telfOrg.appendChild(doc.createTextNode(comp.getOrganizacionDependencia().getOrganizacion().getTelefono()));
            organizacion.appendChild(telfOrg);

            Element dependencia = doc.createElement("dependencia");
            //dependencia.setAttribute("id", comp.getOrganizacionDependencia().getDependencia().getIdDependencia().toString());
            composicion.appendChild(dependencia);

            Element descripcionDep = doc.createElement("descripcion");
            descripcionDep.appendChild(doc.createTextNode(comp.getOrganizacionDependencia().getDependencia().getDescripcion()));
            dependencia.appendChild(descripcionDep);

            for (Entrada entrada : lstEntradas) {

                if (entrada.getContenido() != null || entrada.getTipoEntrada().getIdTipo() == 7 || entrada.getTipoEntrada().getIdTipo() == 9) {
                    if (!entrada.getContenido().trim().equals("") || entrada.getTipoEntrada().getIdTipo() == 7 || entrada.getTipoEntrada().getIdTipo() == 9) {

                        Element ent = doc.createElement("entrada");
                        ent.setAttribute("id", entrada.getIdEntrada().toString());
                        ent.setAttribute("id_tipo", entrada.getTipoEntrada().getIdTipo().toString());
                        composicion.appendChild(ent);

                        Element tipo_entrada = doc.createElement("tipo_entrada");
                        tipo_entrada.appendChild(doc.createTextNode(entrada.getTipoEntrada().getDescripcion()));

                        tipo_entrada.setAttribute("codigo", entrada.getTipoEntrada().getCodigo());
                        tipo_entrada.setAttribute("codificacion", entrada.getTipoEntrada().getSistemaCodificacion());
                        ent.appendChild(tipo_entrada);

                        Element contenido = doc.createElement("contenido");
                        contenido.appendChild(doc.createTextNode(entrada.getContenido()));
                        ent.appendChild(contenido);

                        if (entrada.getTipoEntrada().getIdTipo() == 7) {
                            for (Elemento elem : lstElementosSV) {
                                Element sv = doc.createElement("elemento");
                                sv.setAttribute("tipo", elem.getTipo());
                                sv.appendChild(doc.createTextNode(elem.getDescripcion()));
                                ent.appendChild(sv);
                            }
                        }
                        if (entrada.getTipoEntrada().getIdTipo() == 9) {
                            for (Elemento elem : lstMedicamentos) {
                                Element med = doc.createElement("elemento");
                                med.setAttribute("tipo", elem.getTipo());
                                med.setAttribute("indicacion", elem.getDosisSoloMedicamento() + " " + elem.getIndicacionOfrecuencia());
                                med.appendChild(doc.createTextNode(elem.getDescripcion()));
                                ent.appendChild(med);
//                        
                            }

                            for (Elemento elem : lstExamenes) {
                                Element ex = doc.createElement("elemento");
                                ex.setAttribute("tipo", elem.getTipo());
                                ex.setAttribute("indicacion", elem.getIndicacionOfrecuencia());
                                ex.appendChild(doc.createTextNode(elem.getDescripcion()));
                                ent.appendChild(ex);
                            }
                        }
                    }
                }
            }

            // write the content into xml file
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
         
            //transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "-//XG//DTD SISMEC//EN");
            transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "/home/tesis/Escritorio/HCE-XML/DTD/ClinicaRiobambaXML.dtd");
            
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File("/home/tesis/Escritorio/HCE-XML/" + hce.getPaciente().getCi() + ".xml"));
            
            System.out.println(result);
            transformer.transform(source, result);
            r = true;

        } catch (ParserConfigurationException pce) {
            pce.printStackTrace();
        } catch (TransformerException tfe) {
            tfe.printStackTrace();
        }

        return r;
    }

    public static boolean ActualizarXML(HistoriaClinica hce, Composicion comp, ArrayList<Entrada> lstEntradas, ArrayList<Elemento> lstElementosSV, ArrayList<Elemento> lstMedicamentos, ArrayList<Elemento> lstExamenes) {

        boolean r;
        try {

            String filepath = "/home/tesis/Escritorio/HCE-XML/" + hce.getPaciente().getCi() + ".xml";
       
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            Document doc = docBuilder.parse(filepath);
            Node body = doc.getElementsByTagName("historia_clinica_body").item(0);
            Element composicion = doc.createElement("composicion");
            body.appendChild(composicion);
            composicion.setAttribute("id", comp.getIdComposicion().toString());
            composicion.setAttribute("fecha", comp.getFecha().toString());

            Element ps = doc.createElement("profesionalSalud");
            ps.setAttribute("id", comp.getProfesionalSalud().getCi());
            composicion.appendChild(ps);

            Element nombrePs = doc.createElement("nombres");
            nombrePs.appendChild(doc.createTextNode(comp.getProfesionalSalud().getNombres()));
            ps.appendChild(nombrePs);

            Element apellidoPs = doc.createElement("apellidos");
            apellidoPs.appendChild(doc.createTextNode(comp.getProfesionalSalud().getApellidos()));
            ps.appendChild(apellidoPs);

            Element especialidad = doc.createElement("especialidad");
            especialidad.appendChild(doc.createTextNode(comp.getProfesionalSalud().getEspecializacion()));
            ps.appendChild(especialidad);

            Element organizacion = doc.createElement("organizacion");
            composicion.appendChild(organizacion);

            Element nombreOrg = doc.createElement("nombre");
            nombreOrg.appendChild(doc.createTextNode(comp.getOrganizacionDependencia().getOrganizacion().getNombre()));
            organizacion.appendChild(nombreOrg);

            Element direccionOrg = doc.createElement("direccion");
            direccionOrg.appendChild(doc.createTextNode(comp.getOrganizacionDependencia().getOrganizacion().getDireccion()));
            organizacion.appendChild(direccionOrg);

            Element telfOrg = doc.createElement("telefono");
            telfOrg.appendChild(doc.createTextNode(comp.getOrganizacionDependencia().getOrganizacion().getTelefono()));
            organizacion.appendChild(telfOrg);

            Element dependencia = doc.createElement("dependencia");
            composicion.appendChild(dependencia);

            Element descripcionDep = doc.createElement("descripcion");
            descripcionDep.appendChild(doc.createTextNode(comp.getOrganizacionDependencia().getDependencia().getDescripcion()));
            dependencia.appendChild(descripcionDep);

            for (Entrada entrada : lstEntradas) {

                if (entrada.getContenido() != null || entrada.getTipoEntrada().getIdTipo() == 7 || entrada.getTipoEntrada().getIdTipo() == 9) {
                    if (!entrada.getContenido().trim().equals("") || entrada.getTipoEntrada().getIdTipo() == 7 || entrada.getTipoEntrada().getIdTipo() == 9) {

                        Element ent = doc.createElement("entrada");
                        ent.setAttribute("id", entrada.getIdEntrada().toString());
                        ent.setAttribute("id_tipo", entrada.getTipoEntrada().getIdTipo().toString());
                        composicion.appendChild(ent);

                        Element tipo_entrada = doc.createElement("tipo_entrada");
                        tipo_entrada.appendChild(doc.createTextNode(entrada.getTipoEntrada().getDescripcion()));

                        tipo_entrada.setAttribute("codigo", entrada.getTipoEntrada().getCodigo());
                        tipo_entrada.setAttribute("codificacion", entrada.getTipoEntrada().getSistemaCodificacion());
                        ent.appendChild(tipo_entrada);

                        Element contenido = doc.createElement("contenido");
                        contenido.appendChild(doc.createTextNode(entrada.getContenido()));
                        ent.appendChild(contenido);

                        if (entrada.getTipoEntrada().getIdTipo() == 7) {
                            for (Elemento elem : lstElementosSV) {
                                Element sv = doc.createElement("elemento");
                                sv.setAttribute("tipo", elem.getTipo());
                                sv.appendChild(doc.createTextNode(elem.getDescripcion()));
                                ent.appendChild(sv);
                            }
                        }
                        if (entrada.getTipoEntrada().getIdTipo() == 9) {
                            for (Elemento elem : lstMedicamentos) {
                                Element med = doc.createElement("elemento");
                                med.setAttribute("tipo", elem.getTipo());
                                med.setAttribute("indicacion", elem.getDosisSoloMedicamento() + " " + elem.getIndicacionOfrecuencia());
                                med.appendChild(doc.createTextNode(elem.getDescripcion()));
                                ent.appendChild(med);
//                       
                            }

                            for (Elemento elem : lstExamenes) {
                                Element ex = doc.createElement("elemento");
                                ex.setAttribute("tipo", elem.getTipo());
                                ex.setAttribute("indicacion", elem.getIndicacionOfrecuencia());
                                ex.appendChild(doc.createTextNode(elem.getDescripcion()));
                                ent.appendChild(ex);

                            }
                        }
                    }
                }
            }
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            //transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "-//XG//DTD SISMEC//EN");
            transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "/home/tesis/Escritorio/HCE-XML/DTD/ClinicaRiobambaXML.dtd");

            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File(filepath));
            transformer.transform(source, result);

        } catch (ParserConfigurationException pce) {
            pce.printStackTrace();
        } catch (TransformerException tfe) {
            tfe.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } catch (SAXException sae) {
            sae.printStackTrace();
        }
        return true;
    }

    public static ArrayList<Composicion> LeerXML(String ci) {
        ArrayList<Composicion> lstComposicion = new ArrayList<Composicion>();
        ArrayList<Entrada> lstEntradas = new ArrayList<Entrada>();
        ArrayList<Elemento> lstElemento = new ArrayList<Elemento>();
        try {
            File fXmlFile = new File("/home/tesis/Escritorio/HCE-XML/" + ci + ".xml");
           
            
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();

            Document doc = dBuilder.parse(fXmlFile);

            Organizacion org = new Organizacion();
            Dependencia dep = new Dependencia();
            ProfesionalSalud ps = new ProfesionalSalud();
            HistoriaClinica hce = new HistoriaClinica();

            doc.getDocumentElement().normalize();
            hce.setIdHc(Integer.parseInt(doc.getDocumentElement().getAttribute("id")));
            NodeList nList = doc.getElementsByTagName("composicion");

            for (int temp = 0; temp < nList.getLength(); temp++) {

                Node nNode = nList.item(temp);

                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;

                    //Profesional Salud
                    NodeList nListPs = eElement.getElementsByTagName("profesionalSalud");
                    for (int tempPs = 0; tempPs < nListPs.getLength(); tempPs++) {
                        Node nNodePs = nListPs.item(tempPs);
                        if (nNodePs.getNodeType() == Node.ELEMENT_NODE) {
                            Element eElementPs = (Element) nNodePs;
                            ps = new ProfesionalSalud(eElementPs.getAttribute("id"), eElementPs.getElementsByTagName("nombres").item(0).getTextContent(), eElementPs.getElementsByTagName("apellidos").item(0).getTextContent(), eElementPs.getElementsByTagName("especialidad").item(0).getTextContent());
                        }
                    }
                    //Organizacion
                    NodeList nListO = eElement.getElementsByTagName("organizacion");
                    for (int tempO = 0; tempO < nListO.getLength(); tempO++) {
                        Node nNodeO = nListO.item(tempO);
                        if (nNodeO.getNodeType() == Node.ELEMENT_NODE) {
                            Element eElementO = (Element) nNodeO;
                            org = new Organizacion(0, eElementO.getElementsByTagName("nombre").item(0).getTextContent(), eElementO.getElementsByTagName("direccion").item(0).getTextContent(), eElementO.getElementsByTagName("telefono").item(0).getTextContent());
                        }
                    }

                    //Dependencia
                    NodeList nListD = eElement.getElementsByTagName("dependencia");
                    for (int tempD = 0; tempD < nListD.getLength(); tempD++) {
                        Node nNodeD = nListD.item(tempD);
                        if (nNodeD.getNodeType() == Node.ELEMENT_NODE) {
                            Element eElementD = (Element) nNodeD;
                            dep = new Dependencia(0, eElementD.getElementsByTagName("descripcion").item(0).getTextContent());
                        }
                    }

                    //entrada
                    NodeList nListE = eElement.getElementsByTagName("entrada");
                    for (int tempE = 0; tempE < nListE.getLength(); tempE++) {
                        Node nNodeE = nListE.item(tempE);
                        if (nNodeE.getNodeType() == Node.ELEMENT_NODE) {
                            Element eElementE = (Element) nNodeE;
                            //Elemento
                            NodeList nListElem = eElementE.getElementsByTagName("elemento");
                            for (int tempElem = 0; tempElem < nListElem.getLength(); tempElem++) {
                                Node nNodeElem = nListElem.item(tempElem);
                                if (nNodeElem.getNodeType() == Node.ELEMENT_NODE) {
                                    Element eElementElem = (Element) nNodeElem;

                                    lstElemento.add(new Elemento(eElementElem.getTextContent(), eElementElem.getAttribute("tipo"), eElementElem.getAttribute("indicacion")));

                                }
                            }
                            lstEntradas.add(new Entrada(Integer.parseInt(eElementE.getAttribute("id")), new TipoEntrada(eElementE.getElementsByTagName("tipo_entrada").item(0).getTextContent()), null, eElementE.getElementsByTagName("contenido").item(0).getTextContent(), lstElemento));
                            lstElemento = new ArrayList<Elemento>();
                        }
                    }

                    lstComposicion.add(new Composicion(Integer.parseInt(eElement.getAttribute("id")), ps, hce, new OrganizacionDependencia(0, dep, org), Timestamp.valueOf(eElement.getAttribute("fecha")), lstEntradas));
                    lstEntradas = new ArrayList<Entrada>();
                    org = new Organizacion();
                    dep = new Dependencia();
                    ps = new ProfesionalSalud();

                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return lstComposicion;

    }

    public static ArrayList<Composicion> LeerXMLF(String ci) {
        ArrayList<Composicion> lstComposicion = new ArrayList<Composicion>();
        ArrayList<Entrada> lstEntradas = new ArrayList<Entrada>();
        ArrayList<Elemento> lstElemento = new ArrayList<Elemento>();
        try {
            File fXmlFile = new File("/home/tesis/Escritorio/HCE-XML/" + ci + ".xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();

            Document doc = dBuilder.parse(fXmlFile);

            Organizacion org = new Organizacion();
            Dependencia dep = new Dependencia();
            ProfesionalSalud ps = new ProfesionalSalud();
            HistoriaClinica hce = new HistoriaClinica();

            doc.getDocumentElement().normalize();
            hce.setIdHc(Integer.parseInt(doc.getElementsByTagName("identificador_hce").item(0).getTextContent()));
            NodeList nList = doc.getElementsByTagName("composicion");

            for (int temp = 0; temp < nList.getLength(); temp++) {

                Node nNode = nList.item(temp);

                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;

                    //Profesional Salud
                    NodeList nListPs = eElement.getElementsByTagName("profesionalSalud");
                    for (int tempPs = 0; tempPs < nListPs.getLength(); tempPs++) {
                        Node nNodePs = nListPs.item(tempPs);
                        if (nNodePs.getNodeType() == Node.ELEMENT_NODE) {
                            Element eElementPs = (Element) nNodePs;
                            ps = new ProfesionalSalud(eElementPs.getAttribute("id"), eElementPs.getElementsByTagName("nombres").item(0).getTextContent(), eElementPs.getElementsByTagName("apellidos").item(0).getTextContent(), eElementPs.getElementsByTagName("especialidad").item(0).getTextContent());
                        }
                    }
                    //Organizacion
                    NodeList nListO = eElement.getElementsByTagName("organizacion");
                    for (int tempO = 0; tempO < nListO.getLength(); tempO++) {
                        Node nNodeO = nListO.item(tempO);
                        if (nNodeO.getNodeType() == Node.ELEMENT_NODE) {
                            Element eElementO = (Element) nNodeO;
                            org = new Organizacion(0, eElementO.getElementsByTagName("nombre").item(0).getTextContent(), eElementO.getElementsByTagName("direccion").item(0).getTextContent(), eElementO.getElementsByTagName("telefono").item(0).getTextContent());
                        }
                    }

                    //Dependencia
                    NodeList nListD = eElement.getElementsByTagName("dependencia");
                    for (int tempD = 0; tempD < nListD.getLength(); tempD++) {
                        Node nNodeD = nListD.item(tempD);
                        if (nNodeD.getNodeType() == Node.ELEMENT_NODE) {
                            Element eElementD = (Element) nNodeD;
                            dep = new Dependencia(0, eElementD.getElementsByTagName("descripcion").item(0).getTextContent());
                        }
                    }

                    //entrada
                    NodeList nListE = eElement.getElementsByTagName("entrada");
                    for (int tempE = 0; tempE < nListE.getLength(); tempE++) {
                        Node nNodeE = nListE.item(tempE);
                        if (nNodeE.getNodeType() == Node.ELEMENT_NODE) {
                            Element eElementE = (Element) nNodeE;
                            String contenido = eElementE.getElementsByTagName("contenido").item(0).getTextContent()+"<br />";
                            //Elemento
                            NodeList nListElem = eElementE.getElementsByTagName("elemento");
                            for (int tempElem = 0; tempElem < nListElem.getLength(); tempElem++) {
                                Node nNodeElem = nListElem.item(tempElem);
                                if (nNodeElem.getNodeType() == Node.ELEMENT_NODE) {
                                    Element eElementElem = (Element) nNodeElem;
                                    
                                    lstElemento.add(new Elemento(eElementElem.getTextContent(), eElementElem.getAttribute("tipo"), eElementElem.getAttribute("indicacion")));
                                    contenido=contenido.concat(Util.ponerSaltoLinea(eElementElem.getTextContent()+" "+eElementElem.getAttribute("indicacion")))+"<br />";
                                }
                            }
                            Integer i = Integer.parseInt(eElementE.getAttribute("id_tipo"));
                            if (i == 8 || i == 9) {
                                lstEntradas.add(new Entrada(Integer.parseInt(eElementE.getAttribute("id")), new TipoEntrada(Integer.parseInt(eElementE.getAttribute("id_tipo")), eElementE.getElementsByTagName("tipo_entrada").item(0).getTextContent()), null, contenido, lstElemento));
                            }

                            lstElemento = new ArrayList<Elemento>();
                        }
                    }

                    lstComposicion.add(new Composicion(Integer.parseInt(eElement.getAttribute("id")), ps, hce, new OrganizacionDependencia(0, dep, org), Timestamp.valueOf(eElement.getAttribute("fecha")), lstEntradas));
                    lstEntradas = new ArrayList<Entrada>();
                    org = new Organizacion();
                    dep = new Dependencia();
                    ps = new ProfesionalSalud();

                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return lstComposicion;

    }

    public static HistoriaClinica LeerXMLHCE(String ci) {
        HistoriaClinica hce = new HistoriaClinica();
        try {
            File fXmlFile = new File("/home/tesis/Escritorio/HCE-XML/" + ci + ".xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();

            Document doc = dBuilder.parse(fXmlFile);
            Paciente pac = new Paciente();
            EstadoCivil ec = new EstadoCivil();
            Etnia et = new Etnia();

            doc.getDocumentElement().normalize();
            NodeList nList = doc.getElementsByTagName("historia_clinica_header");

            for (int temp = 0; temp < nList.getLength(); temp++) {

                Node nNode = nList.item(temp);

                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;
                     hce.setIdHc(Integer.parseInt(eElement.getElementsByTagName("identificador_hce").item(0).getTextContent()));
                    //paciente
                    NodeList nListP = eElement.getElementsByTagName("paciente");
                    for (int tempP = 0; tempP < nListP.getLength(); tempP++) {
                        Node nNodeP = nListP.item(tempP);
                        if (nNodeP.getNodeType() == Node.ELEMENT_NODE) {
                            Element eElementP = (Element) nNodeP;
                            //estado civil
                            NodeList nListEC = eElementP.getElementsByTagName("estadoCivil");
                            for (int tempEC = 0; tempEC < nListEC.getLength(); tempEC++) {
                                Node nNodeEC = nListEC.item(tempEC);
                                if (nNodeEC.getNodeType() == Node.ELEMENT_NODE) {
                                    Element eElementEC = (Element) nNodeEC;
                                    ec= new EstadoCivil(Integer.parseInt(eElementEC.getAttribute("id")), eElementEC.getElementsByTagName("descripcion").item(0).getTextContent());
                                }
                            }
                            //etnia
                            NodeList nListE = eElementP.getElementsByTagName("etnia");
                            for (int tempE = 0; tempE < nListE.getLength(); tempE++) {
                                Node nNodeE = nListE.item(tempE);
                                if (nNodeE.getNodeType() == Node.ELEMENT_NODE) {
                                    Element eElementE = (Element) nNodeE;
                                    et = new  Etnia(Integer.parseInt(eElementE.getAttribute("id")),eElementE.getElementsByTagName("descripcion").item(0).getTextContent());
                                }
                            }
                            pac = new Paciente(Integer.parseInt(eElementP.getAttribute("id")), eElementP.getElementsByTagName("cedula").item(0).getTextContent(),ec,et,eElementP.getElementsByTagName("nombres").item(0).getTextContent(),eElementP.getElementsByTagName("apellidos").item(0).getTextContent(),eElementP.getElementsByTagName("sexo").item(0).getTextContent(), eElementP.getElementsByTagName("fechaNac").item(0).getTextContent(), eElementP.getElementsByTagName("religion").item(0).getTextContent(), eElementP.getElementsByTagName("lateralidad").item(0).getTextContent(),eElementP.getElementsByTagName("lugarNacimiento").item(0).getTextContent(), eElementP.getElementsByTagName("lugarResidencia").item(0).getTextContent(), eElementP.getElementsByTagName("direccion").item(0).getTextContent(), eElementP.getElementsByTagName("telefono").item(0).getTextContent(), eElementP.getElementsByTagName("profesion").item(0).getTextContent());
                        }
                       
                        hce.setPaciente(pac);
                    }
                    
                    pac = new Paciente();
                    

                }

              
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return hce;

    }

    public static boolean validateWithDTDUsingDOM(String xml) 
    throws ParserConfigurationException, IOException
  {
    try {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      factory.setValidating(true);
      factory.setNamespaceAware(true);

      DocumentBuilder builder = factory.newDocumentBuilder();

      builder.setErrorHandler(
          new ErrorHandler() {
            public void warning(SAXParseException e) throws SAXException {
              System.out.println("WARNING : " + e.getMessage()); // do nothing
            }

            public void error(SAXParseException e) throws SAXException {
              System.out.println("ERROR : " + e.getMessage());
              throw e;
            }

            public void fatalError(SAXParseException e) throws SAXException {
              System.out.println("FATAL : " + e.getMessage());
              throw e;
            }
          }
          );
      
      builder.parse(new InputSource("/home/tesis/Escritorio/HCE-XML/" + xml + ".xml"));
      return true;
    }
    catch (ParserConfigurationException pce) {
      throw pce;
    } 
    catch (IOException io) {
      throw io;
    }
    catch (SAXException se){
      return false;
    }
  }
    
    
    public static ArrayList<Composicion> LeerXML2(String ci) {
        ArrayList<Composicion> lst = new ArrayList<Composicion>();
        try {

            DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

            Document doc = documentBuilder.parse(new InputSource(new FileInputStream("/home/tesis/Escritorio/HCE-XML/" + ci + ".xml")));
            NodeList listaNodos = doc.getElementsByTagName("composicion");
            for (int i = 0; i < listaNodos.getLength(); i++) {
                Node nodo = listaNodos.item(i);
                for (int j = 0; j < nodo.getChildNodes().getLength(); j++) {
                    if (nodo instanceof Element) {
                        System.out.println("Datos Composicion: " + nodo.getChildNodes().item(j).getTextContent());
                    }
                }
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();

        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }

        return lst;
    }

}
